#ifndef _GLOBAL_VAR_DEF_H_
#define _GLOBAL_VAR_DEF_H_

#include <stdint.h>


/**
 * @brief:  本文件定义所有电机控制有关的参数结构体
 */

 #define BSP_ADC_CHANNEL_COUNT  8   // ADC 通道数

 /**
 * @brief 比较两个值的大小并返回差值或0
 * @param A 第一个操作数（任意数值类型）
 * @param B 第二个操作数（需与A类型兼容）
 * @return 若A>B返回A-B，否则返回0
 */
#define SAFE_SUBTRACT(A, B) ((A) > (B) ? (A) - (B) : 0)

// 配置参数
#define M_PI (3.14159265358979323846f)
#define TRIG_TABLE_SIZE 1024  // 查表精度，2的幂次方以便快速取模
#define TRIG_TWO_PI (2.0f * M_PI)
#define TRIG_PI_HALF (M_PI / 2.0f)



// 相电流相关结构体
typedef struct PhaseCurrent
{
    uint16_t offset_phaseA;  // A 相零偏值
    uint16_t offset_phaseB;  // B 相零偏值
    uint16_t offset_phaseC;  // C 相零偏值

    int16_t adc_phase_valuesA; // 消零后的A相电流ADC值， 正负代表电流方向
    int16_t adc_phase_valuesB; // 消零后的B相电流ADC值， 正负代表电流方向
    int16_t adc_phase_valuesC; // 消零后的C相电流ADC值， 正负代表电流方向

    volatile float current_PhaseA;   // A 相电流值   (unit: A)
    volatile float current_PhaseB;   // B 相电流值   (unit: A)
    volatile float current_PhaseC;   // C 相电流值   (unit: A)

}st_PhaseCurrent;

 // 母线电压相关结构体
typedef struct VolBus
{
    float VBus;             // 母线电压值 (unit: V)
}st_VolBus;


typedef enum
{
    Machine_Init = 0,   // 系统上电初始化状态
    Machine_STOP,       // 停止状态
    Machine_RUN_INIT,   // RUN 的前置状态, 对算法参数进行初始化
    Machine_Prealignment,//角度预定位
    Machine_RUN,        // 算法计算，电机控制
    Machine_FAULT,      // 发生故障
}st_MachineState;

typedef struct {
    uint32_t days;     // 天数
    uint32_t hours;    // 小时
    uint32_t minutes;  // 分钟
    uint32_t seconds;  // 秒
    uint32_t ms_count; // 毫秒计数器
} RuntimeCounter;

typedef struct {
    // 电压参考值 (标幺值)
    float M_VAref;
    float M_VBref;
    float M_VCref;
    
    // 三相电压原始参考值
    float VAref;
    float VBref;
    float VCref;
    
    // α-β坐标系分量
    float Valpha;
    float Vbeta;
    
    // 电压幅值和角度
    float Vmag;
    float Vang;
    
    // 扇区编号
    uint16_t Sector;
    
    // 作用时间计算
    float Ta;
    float Tb;
    float Tc;
    
    // PWM占空比
    float Tao;  // A相占空比
    float Tbo;  // B相占空比
    float Tco;  // C相占空比
    
    // PWM输出序列 (ABC三相切换点)
    uint32_t OutputSeq[3];
    
    // 直流母线电压
    float VdcLink;
    
    // 三角波计数器最大值
    uint32_t TriangularCount;

    // 电机运行时间
    float nTime;
} st_CovModStrategy;

typedef struct
{
    float CurrentA;
    float CurrentB;
    float CurrentC;

    float Id_Set;
    float Id_Feedback;
    float Id_Error ;
    float Id_kp;
    float Id_ki;
    float Id_ki_Intergral;
    float Id_Integrator_SYSTEM;
    float Iq_Set;
    float Iq_Feedback;
    float Iq_Error;
    float Iq_kp;
    float Iq_ki;
    float Iq_ki_Intergral;
    float Iq_Integrator_SYSTEM;
    float Vqs_Set;
    float Vds_Set;
    float wt;
    float phir;
    float pn;
    float Lq;
    float Ld;
    float J;
    float CurrentAlpha;
    float CurrentBeta;
    float Ts;

    float Speed_kp;
    float Speed_ki;
    float Speed_kd;
    float wt_qep;
    float wt_qep_last;
    float wt_delta;
    float wm;
    float we;
    float Speed_Set_Ramp;
    float wt_qep_sum;

    float Speed_Set;
    float Speed_WmEnc;
    float Speed_WmEnc_wz;
    float Speed_Feedback;
    float Speed_Error;
    float Speed_Error_last;
    float Speed_FilterCoefficient;
    float Speed_Filter_DSTATE;
    float Speed_ki_Intergral;
    float Speed_Observer_sum_interger;
    float Speed_Observer_h1;
    float Speed_Observer_h2;
    float Speed_Observer_h3;
    float Speed_Observer_h2_interger;
    float Speed_Observer_h3_sum;
    float Speed_Observer_h3_interger;
    float Speed_Observer_sum_interger_flag;
    float Speed_Observer_input_sum;
    float Speed_Enc;
    float Speed_Observer_speed_wm;
    float Speed_Observer_speed_wt;
    float TL;
    float Torque_Set;
    float Torque_Limit_P;
    float Torque_Limit_N;

    float Position_Set;           
    float Position_Feedback;      
    float Position_Error;         
    float Position_Error_last;
    float Position_kp;            
    float Position_ki;            
    float Position_ki_Intergral;  
    float Position_kd;            
    float Position_FilterCoefficient;
    float Position_Filter_DSTATE;


}st_MCStrategy;


// 逆变器相关参数
typedef struct
{
    uint16_t adc_raw_values[BSP_ADC_CHANNEL_COUNT]; // 3,4,5是A,B,C相电流AD值   7 是母线电压AD值
    st_PhaseCurrent motor_phaseCurrent;   // 相电流
    st_VolBus   motor_vBus; // 母线电压        
    uint8_t     adc_offset_flag;  // 上电偏置检测是否完成标志
}st_Invertor;

// 电机控制相关所有参数结构体 (PID参数等)
typedef struct MotorCtrlParam
{
    uint16_t adc_raw_values;   
}st_MotorCtrlParam;


//CANOPEN传递的参数
typedef struct
{
	uint32_t Ia;
	uint32_t Ib;
	uint32_t Ic;
	uint32_t speed;
	
}canopen_Param;

extern st_Invertor g_invertorParam; // 逆变器所有参数
extern st_MotorCtrlParam g_MotorCtrlParam;     // 电机控制的所有参数
extern RuntimeCounter runtime;
extern st_CovModStrategy CovModStrategy;
extern st_MCStrategy MCStrategy;
extern float sine_table[TRIG_TABLE_SIZE];
extern uint8_t table_initialized;
extern canopen_Param CANOpen_Param;


void StateMachine(void);
void StateSwitch(st_MachineState state);

void RuntimeCounter_Init(void);
void RuntimeCounter_Update(void);
void RuntimeCounter_GetString(char* buffer, uint32_t size);



/**
 * 初始化三角函数表
 * 必须在使用前调用
 */
void trig_table_init(void);

/**
 * 根据角度获取正弦值（0-2π范围）
 * @param angle 弧度制角度
 * @return 正弦值
 */
float sin_lookup(float angle);

/**
 * 根据角度获取余弦值（0-2π范围）
 * @param angle 弧度制角度
 * @return 余弦值
 */
float cos_lookup(float angle);




#endif /* End of  _GLOBAL_VAR_DEF_H_*/

